﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace Tencent.OA.App
{
    public static class EnumHelper
    {
        /// <summary>
        /// 尝试从指定的参数 <paramref name="args"/> 中获取泛型参数(必须为一个枚举类型)对应的值。
        /// </summary>
        /// <typeparam name="TEnum"><para> 必须为一个枚举类型。</para></typeparam>
        /// <param name="args"> 必须为泛型参数(枚举类型)的特定枚举常数的值（根据其基础类型）。 </param>
        /// <param name="value">泛型参数(枚举类型)的对象，如果 <paramref name="args"/> 不是特定枚举常数的值，则初始化该对象，方法返回false。</param>
        /// <returns> 如果 <paramref name="args"/> 是泛型参数(枚举类型)特定枚举常数的值，返回true，否则返回false。</returns>
        public static bool TryParse<TEnum>(object args, out TEnum value)
        {
            if (typeof(TEnum).IsEnum && args != null)
            {
                // 如果传入的是数字型枚举值
                if (Regex.IsMatch(args.ToString(), @"\d+", RegexOptions.Compiled) && Enum.IsDefined(typeof(TEnum), args))
                {
                    value = (TEnum)Enum.Parse(typeof(TEnum), args.ToString(), true);
                    return true;
                }
                // 传入的args是字符串，对应为枚举的定义
                if (IsDefine(typeof(TEnum), args.ToString()))
                {
                    value = (TEnum)Enum.Parse(typeof(TEnum), args.ToString(), true);
                    return true;
                }
            }
            value = default(TEnum);
            return false;
        }

        private static bool IsDefine(Type type, string args)
        {
            foreach (string s in Enum.GetNames(type))
            {
                if (string.Compare(s, args, true) == 0)
                    return true;
            }
            return false;
        }
    }
}
